home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / umich / utils / overscn3.arc / OVERSCAN.S < prev    next >
Text File  |  1989-07-07  |  82KB  |  1,900 lines

  1. ;----------------------------------------------------;
  2. ;                                                    ;
  3. ;      OVERSCAN.S       Version 1.6                  ;
  4. ;      Bernd Gebauer   ,Berlin 31.05.89              ;
  5. ;      Karsten Isakovic,Berlin 07.07.89              ;
  6. ;                                                    ;
  7. ;  RAMTOS 1.4 / BETATOS / ROMTOS 1.4 / BLITTER TOS   ;
  8. ; -------------------------------------------------  ;
  9. ;                                                    ;
  10. ;      GFA-Assembler 1.2                             ;
  11. ;                                                    ;
  12. ;----------------------------------------------------;
  13.  
  14.  
  15. ; ------------ NEGATIVE LINE-A VARIABLEN -------------
  16.  
  17. M_POS_HX       = -$358
  18. WKXRez         = -$2b4
  19. WKYRez         = -$2b2
  20. CUR_X          = -$158
  21. CUR_Y          = -$156
  22. CUR_FLAG       = -$154
  23. MOUSE_FLAG     = -$153
  24. SAVE_LEN       = -$14a
  25. v_cel_ht       = -$2e
  26. v_cel_mx       = -$2c
  27. v_cel_my       = -$2a
  28. v_cel_wr       = -$28
  29. v_cur_add      = -$22
  30. v_cur_of       = -$1e
  31. v_cur_x        = -$1c
  32. v_cur_y        = -$1a
  33. v_rez_hz       = -$c
  34. v_rez_vt       = -4
  35. bytes_lin      = -2
  36. ; ---------- LINE-A VARIABLEN ------------------------
  37.  
  38. v_planes       = 0
  39. width          = 2
  40. col_bit0       = $18
  41. col_bit1       = $1a
  42. col_bit2       = $1c
  43. col_bit3       = $1e
  44. lstlin         = $20
  45. lnmask         = $22
  46. wmode          = $24
  47. x1             = $26
  48. y1             = $28
  49. x2             = $2a
  50. y2             = $2c
  51. patptr         = $2e
  52. patmsk         = $32
  53. mfill          = $34
  54. clip           = $36
  55.  
  56. ; ----------------- HARDWARE + TOS -------------------
  57.  
  58. gemdos         = 1
  59. bios           = 13
  60. xbios          = 14
  61. Pterm0         = 0       ; Gemdos
  62. Cconin         = 1       ; Gemdos
  63. Cnecin         = 8       ; Gemdos
  64. Cconws         = 9       ; Gemdos
  65. Dgetdrv        = 25      ; Gemdos
  66. Ptermres       = 49      ; Gemdos
  67. Fopen          = 61      ; Gemdos
  68. Fclose         = 62      ; Gemdos
  69. Fwrite         = 64      ; Gemdos
  70. Fseek          = 66      ; Gemdos
  71. Pterm          = 76      ; Gemdos
  72. Kbshift        = 11      ; bios
  73. Physbase       = 2       ; xbios
  74. Setscreen      = 5       ; xbios
  75. Supexec        = 38      ; xbios
  76. Dosound        = 32      ; xbios
  77. dostrap        = $84
  78. gemtrap        = $88
  79. xbiostrap      = $b8
  80. memtop         = $436
  81. defshiftmd     = $44b
  82. sshiftmd       = $44c
  83. v_bas_add      = $44e
  84. _nvbls         = $454
  85. _vblqueue      = $456
  86. dumpflag       = $4ee
  87. sysbase        = $4f2
  88. hardcopy       = $502
  89. vid_bashigh    = $ff8201
  90. vid_basmid     = $ff8203
  91. vid_ismid      = $ff8207
  92. vid_pal3       = $ff8246
  93. vid_palF       = $ff825e
  94. add_len        = $9000
  95.  
  96.                .TEXT 
  97. main:          bra.s     Start_of_Code       ; Zum Anfang springen
  98.  
  99. ;#############################################################
  100. ;#
  101. ;# Die Tabelle der BildschirmWerte
  102. ;#
  103. ;#############################################################
  104. ScreenTab:     .DC.w 400,832,672             ;   X-Auflösung Low,Mid,High
  105.                .DC.w 280,280,480             ;   Y-Auflösung
  106.                .DC.w 236,236,100             ;   Bytes pro Zeile
  107.                .DC.l -$1600,-$1600,$2000     ;   VideoAdd  <> Memtop Offset
  108.                .DC.l 252,248,9800            ;   v_bas_add <> Memtop Offset
  109.                .DC.w 320,640,640             ;   Alte X-Auflösung
  110.                .DC.w 200,200,400             ;   Alte Y-Auflösung
  111. TruePhys:      .DC.w 0   ;                       Physbase Emulation aus
  112. ActivateKey:   .DC.b 9,0 ;                       Hardcopy Taste
  113. ;#############################################################
  114. ;#
  115. ;# Das Hauptprogramm
  116. ;#
  117. ;#############################################################
  118.  
  119. Start_of_Code: movea.l   4(sp),a5            ; Basepointer einrichten
  120.                lea.l     $100(a5),sp         ; Stack einrichten
  121.  
  122.                pea       do_setup(pc)        ; Test und Installation im
  123.                move.w    #Supexec,-(sp)      ; Supervisormodus durchführen
  124.                trap      #xbios              ; Ergebnis in inst_ok
  125.                addq.l    #6,sp
  126.  
  127.                move.w    inst_ok,d0
  128.                tst.w     d0                  ; war Installation erfolgreich ?
  129.                bne       not_ok              ; leider nein, raus
  130.  
  131.                move.w    #Dgetdrv,-(sp)      ; Bootlaufwerk holen
  132.                trap      #gemdos             ;
  133.                addq.l    #2,sp               ;
  134.                lea.l     save_name(pc),a0    ;
  135.                add.b     d0,(a0)             ; und einstellen
  136.  
  137.                move.w    #-1,-(sp)           ;   Irgendeine Sondertaste gedrückt
  138.                move.w    #Kbshift,-(sp)      ;
  139.                trap      #bios               ;
  140.                addq.l    #4,sp               ;
  141.                tst.w     d0
  142.                beq       DoIntro
  143.                bsr       UserInstall
  144.                bra       DoTitle
  145. DoIntro:       bsr       Intro               ; GrowBox und Sound ausgeben
  146. DoTitle:       pea       msg_title(pc)       ; Titelzeile ausgeben
  147.                move.w    #Cconws,-(sp)
  148.                trap      #gemdos
  149.                addq.l    #6,sp
  150.                pea       msg_installed(pc)   ; 'Installiert' Meldung ausgeben
  151.                move.w    #Cconws,-(sp)
  152.                trap      #gemdos
  153.                addq.l    #6,sp
  154.  
  155.                clr.w     -(sp)               ; Resident beenden
  156.                lea.l     _ende(pc),a0        ;   Programmende
  157.                suba.l    a5,a0               ; - Programmanfang
  158.                move.l    a0,-(sp)            ; = Programmlaenge
  159.                move.w    #Ptermres,-(sp)
  160.                trap      #gemdos
  161. ;-----------------------------------------------------
  162. not_ok:        pea       msg_title(pc)       ; Titelzeile ausgeben
  163.                move.w    #Cconws,-(sp)
  164.                trap      #gemdos
  165.                addq.l    #6,sp
  166.                move.w    inst_ok,d0
  167.                cmpi.w    #1,d0               ; war's das falsche TOS ?
  168.                bne       main_2              ; nein -> Kein Overscan-Modus
  169.  
  170.                pea       msg_notactive(pc)   ; 'Nicht aktiviert' Meldung ausgeben
  171.                move.w    #Cconws,-(sp)
  172.                trap      #gemdos
  173.                addq.l    #6,sp
  174.                bra       Goodbye             ; einfach beenden
  175. ;-----------------------------
  176. main_2:        cmpi.w    #2,d0
  177.                bne       main_3
  178.                pea       msg_noTos(pc)       ; 'Falsches TOS' Meldung ausgeben
  179.                move.w    #Cconws,-(sp)
  180.                trap      #gemdos
  181.                addq.l    #6,sp
  182.                bra       wait_key            ; einfach beenden
  183. ;-----------------------------
  184. main_3:        pea       msg_already(pc)     ; 'Schon installiert' Meldung
  185.                move.w    #Cconws,-(sp)       ; ausgeben
  186.                trap      #gemdos
  187.                addq.l    #6,sp               ;  und
  188. ;-----------------------------
  189. wait_key:      move.w    #Cnecin,-(sp)       ; Auf Tastendruck warten
  190.                trap      #gemdos
  191.                addq.l    #2,sp
  192. ;-----------------------------
  193. Goodbye:       clr.w     -(sp)               ; Programm beenden (Returncode 0)
  194.                trap      #gemdos
  195.  
  196. ;############################################################
  197. ;#
  198. ;# Die Installations-Routine
  199. ;#
  200. ;#############################################################
  201.  
  202. do_setup:      movem.l   d0-d7/a0-a6,-(sp)
  203.                move.w    #3,inst_ok          ; Status : schon installiert
  204.  
  205.                movea.l   dostrap,a0          ; GemDos-Trap nach OVERSCAN absuchen
  206.  
  207. tstXBRA:       cmpi.l    #'XBRA',-12(a0)     ; XBRA ?
  208.                bne       noXBRA              ; nein -> Ende der Vektorkette
  209.                cmpi.l    #'OVER',-8(a0)      ; OVER ?
  210.                beq       EndSetup            ; ja   -> Schon Installiert !
  211.                movea.l   -4(a0),a0           ;
  212.                bra       tstXBRA             ; weiter suchen
  213.  
  214. noXBRA:        move.w    #2,inst_ok          ; Status : falsches TOS
  215. ;----------------------------  auf richtige TOS-Version testen
  216.  
  217.                sf        BadTos              ; TOS als ok annehmen
  218.  
  219. testBETATOS:   movea.l   #$170ee,a0          ;-------- Ist es BETA-RAMTOS ?
  220.                cmpi.l    #$cec0e84f,(a0)     ; schon gepatched ?
  221.                beq       isBETA              ; ja
  222.                cmpi.l    #$e848cec0,(a0)     ;     LSR #4,D0 / MULU D0,D7 ?
  223.                bne       testRAMTOS1_4       ; nein -> RAMTOS1.4
  224.                move.l    #$cec0e84f,$170ee   ;     MULU D0,D7 / LSR #4,D7
  225. isBETA:        movea.l   $5232,a0            ;     A0 = Zeiger auf MemAllocList
  226.                bra       TOSok               ;
  227.  
  228. testRAMTOS1_4: movea.l   #$17192,a0          ;-------- Ist es RAMTOS 1.4 ?
  229.                cmpi.l    #$cec0e84f,(a0)     ; schon gepatched ?
  230.                beq       isRAMTOS1_4
  231.                cmpi.l    #$e848cec0,(a0)     ;
  232.                bne       testROMTOS1_4       ; nein -> ROMTOS1.4
  233.                move.l    #$cec0e84f,$17192   ;     1. mal Scrollfehler
  234. isRAMTOS1_4:   move.l    #$cec0e84f,$171d6   ;     2. mal Scrollfehler beheben
  235.                movea.l   $5232,a0            ;     A0 = Zeiger auf MemAllocList
  236.                bra       TOSok               ;
  237.  
  238. testROMTOS1_4: movea.l   sysbase,a1          ;-------- Ist es ROMTOS 1.4 ?
  239.                cmpi.w    #$0104,2(a1)        ;     os_version testen
  240.                bne       testTOS1_2          ; nein -> TOS 1.2 (BlitterTOS)
  241.                movea.l   $532c,a0            ;     A0 = Zeiger auf MemAllocList
  242.                bra       TOSok               ;
  243.  
  244. testTOS1_2:    cmpi.w    #$0102,2(a1)        ;-------- Ist es TOS 1.2 ?
  245.                bne       EndSetup            ; nein -> falsches TOS -> ENDE
  246.                st        BadTos              ;     BlitterTOS -> Flag setzen
  247.                movea.l   $7e92,a0            ;     A0 = Zeiger auf MemAllocList
  248.  
  249. TOSok:         move.w    #1,inst_ok          ; Status : Nicht im OVERSCAN-Modus
  250. ;---------------------------------------------
  251. ; Ist der Schalter umgelegt (OVERSCAN aktiv) ?
  252. ; Es wird gewartet, bis der Videoadresszähler bis zum Ende
  253. ; der normalen Bildschirmseite hochgezählt hat.
  254. ; Dann wird getestet, ob er auf den Anfang zurückspringt.
  255. ; Tut er das nicht, ist OVERSCAN aktiv.
  256.                clr.w     d0
  257.                move.b    vid_basmid,d0       ;
  258.                move.w    d0,d1               ;
  259.                addi.w    #$7d,d1             ;
  260. Wait1:         cmp.b     vid_ismid,d1        ;
  261.                bne       Wait1               ;
  262. Wait2:         cmp.b     vid_ismid,d1        ;
  263.                beq       Wait2               ;
  264.                cmp.b     vid_ismid,d0        ;
  265.                beq       EndSetup            ; Nicht aktiv -> Beenden
  266.  
  267.                clr.w     inst_ok             ; Status : OVERSCAN aktiv
  268.  
  269.                move.l    v_bas_add,StartBasAdd    ; Startaddr des Bildschirms
  270.  
  271.                move.l    memtop,d0           ;     Letzte beschreibbare Addresse
  272.                addi.l    #$8000,d0           ;     bestimmen und merken
  273.                move.l    d0,MemEnd           ;
  274.  
  275.                subi.l    #add_len,8(a0)      ;     Belegten Speicherblock
  276.                subi.l    #add_len,memtop     ;     ... verkürzen
  277.  
  278.                tst.b     BadTos              ; BlitterTOS ?
  279.                beq       no_extra_buff       ; nein, weiter
  280.                subi.l    #32768,8(a0)        ;     32K Sicherheitpuffer ...
  281.                subi.l    #32768,memtop       ;     ... vor Bildspeicher anlegen
  282. no_extra_buff: 
  283.                clr.w     d0
  284.                move.b    sshiftmd,d0
  285.                move.w    d0,Reso             ;     Auflösung merken
  286.                .DC.w $a000                   ; LineA init
  287.                move.l    d0,LineA            ;     Zeiger auf LineA Variablen
  288.                move.l    memtop,MyMemtop     ;     AltenWert sichern
  289.                bsr       SetOverscan         ;     Overscan Werte einstellen
  290. ;
  291. ; Diese einmalige Initialisieren der Werte reicht nicht aus,
  292. ; da sie beim Starten vom AES wieder zurückgesetzt werden.
  293. ; Wir müssen also die Werte kurz nach v_opnwk nochmal setzen
  294. ;
  295. ;----------------------> ALSO  GEM-Routine (AES/VDI) umleiten
  296.                lea.l     OldVec(pc),a0       ; Alten GemTrapVektor retten
  297.                move.l    gemtrap,(a0)        ;
  298.                lea.l     MyGem(pc),a0        ;
  299.                move.l    a0,gemtrap          ; und neuen Vektor eintragen
  300.                tst.b     BadTos              ; BlitterTOS ?
  301.                beq       NoSlot              ; nein -> Nicht in VBL einhängen
  302.  
  303.                move.w    _nvbls,d0           ; Anzahl Routinen in _vblqueue
  304.                lsl.w     #2,d0               ; mal sizeof(long)
  305.                movea.l   _vblqueue,a0        ; Zeiger auf _vblqueue
  306.                moveq.l   #4,d1               ; ersten Slot auslassen
  307. TestSlot:      tst.l     0(a0,d1.w)          ; ist Eintrag frei ?
  308.                beq.s     SlotFound           ; ja, gefunden
  309.                addq.w    #4,d1               ; offset für nächsten Slot
  310.                cmp.w     d0,d1               ; Ende der Liste ?
  311.                bne.s     TestSlot            ; nein, nächsten Slot testen
  312.                bra       NoSlot              ; keinen freien Slot gefunden, raus
  313. SlotFound:     
  314.                lea.l     MyVB(pc),a1         ; eigene VBL-Routine ...
  315.                move.l    a1,0(a0,d1.w)       ; ... in Slot eintragen
  316. NoSlot:        
  317. ;---------------------------- Gemdos umleiten
  318.                lea.l     OldDos(pc),a0       ;     Alten GemdosVektor retten
  319.                move.l    dostrap,(a0)        ;
  320.                lea.l     MyDos(pc),a0        ;
  321.                move.l    a0,dostrap          ;     und neuen Vektor eintragen
  322. ;---------------------------- Xbios umleiten
  323.                lea.l     OldXbios(pc),a0     ;     Alten XbiosVektor retten
  324.                move.l    xbiostrap,(a0)      ;
  325.                lea.l     MyXbios(pc),a0      ;
  326.                move.l    a0,xbiostrap        ;     und neune Vektor eintragen
  327. ;---------------------------- Hardcopy-Routine umleiten
  328.                lea.l     OldHard(pc),a0      ;     Alten HardcopyVektor retten
  329.                move.l    hardcopy,(a0)       ;
  330.                lea.l     MyHard(pc),a0       ;
  331.                move.l    a0,hardcopy         ;     und neuen Vektor eintragen
  332.  
  333.                sf        GemStarted
  334. EndSetup:      movem.l   (sp)+,d0-d7/a0-a6
  335.                rts       
  336.  
  337. ;#############################################################
  338. ;#
  339. ;# Die umgebogenen Traps und Vektoren
  340. ;# ----------------------------------
  341. ;#        MyGem      AES/VDI Trap
  342. ;#        MyDos      GEMDOS  Trap
  343. ;#        MyXbios    XBIOS   TRAP
  344. ;#        MyHard     Hardcopy-Vektor
  345. ;#        MyVB       VerticalBlank-Vektor (nur bei BlitterTOS )
  346. ;#        MyMouse    Mouse-Vektor         (nur bei BlitterTOS)
  347. ;#
  348. ;################################################ GEM- TRAP
  349.  
  350. ; XBRA-Protokoll
  351.                .DC.b "XBRAOVER"              ; !! Ja, das ist alles !!
  352. OldVec:        .DC.l 0
  353. MyGem:         cmpi.w    #$73,d0             ; Ist es ein VDI-Aufruf ?
  354.                bne       NotMyGem            ;   nein -> weiter
  355.                movea.l   d1,a0               ; Addresse der VDI-Parameterfelder
  356.                move.l    12(a0),WorkOut      ; WorkOut-Zeiger speichern
  357.                movea.l   (a0),a0             ; VDI-Control[0] = VDI-Befehlscode
  358.                cmpi.w    #1,(a0)             ; ist es Open-WorkStation ?
  359.                bne       NotMyGem            ;    nein-> weiter
  360.                movea.l   d1,a0
  361.                movea.l   4(a0),a0            ; WorkIn-Zeiger
  362.                cmpi.w    #5,(a0)             ;    WorkIn[0] gleich Screen ?
  363.                bge       NotMyGem            ;    nein -> weiter
  364. ;-------------> NACH !!! 'v_opnwk()' in Patchroutine springen
  365.                move.l    2(sp),Back          ; Orginal Rücksprungadresse merken
  366.                lea.l     PatchIt(pc),a0      ; Rücksprung auf 'PatchIt' ...
  367.                move.l    a0,2(sp)            ; ... umleiten
  368. NotMyGem:      movea.l   OldVec(pc),a0       ; Orginal GEM-Routine ...
  369.                jmp       (a0)                ; ... ausführen
  370. ;----------------------------------------------------------
  371. PatchIt:       bsr       SetOverscan         ; LineA Werte nochmal eintragen
  372.  
  373.                move.w    #-1,-(sp)           ;   Auf rechte Schifttaste testen
  374.                move.w    #Kbshift,-(sp)      ;
  375.                trap      #bios               ;
  376.                addq.l    #4,sp               ;
  377.                tst.w     d0
  378.                beq       PatchCont
  379.  
  380.                bsr       UserInstall
  381.  
  382. PatchCont:     bsr       ClearScreen         ; Rand löschen
  383.                pea       msg_erase(pc)       ; und Mitte auf Weiss
  384.                move.w    #Cconws,-(sp)       ;
  385.                trap      #gemdos             ;
  386.                addq.l    #6,sp               ;
  387.                st        GemStarted          ; Okay GEM läuft
  388.                movea.l   WorkOut,a0          ; Adresse des Workout-Feldes
  389.                move.w    RezX,0(a0)          ; Work_out[0] = Breite
  390.                move.w    RezY,2(a0)          ; Work_out[1] = Höhe
  391.  
  392.                move.w    VPlanes,d0          ; Farben Vorgeben
  393.                cmpi.w    #4,d0
  394.                bne       PatchMid
  395.                move.w    #200,78(a0)
  396.                move.w    #16,26(a0)
  397.                bra       PatchEnd
  398. PatchMid:      cmpi.w    #2,d0
  399.                bne       PatchHigh
  400.                move.w    #200,78(a0)
  401.                move.w    #4,26(a0)
  402.                bra       PatchEnd
  403. PatchHigh:     
  404.                move.w    #2,78(a0)
  405.                move.w    #2,26(a0)
  406.  
  407. PatchEnd:      move.l    Back,-(sp)          ; Zum 'v_opnwk()' - Aufrufer
  408.                rts                           ;   zurückspringen
  409. ;################################################ GEMDOS-Trap
  410.                .DC.b "XBRAOVER"
  411. OldDos:        .DC.l 0
  412. MyDos:         move.w    (sp),d0             ; Je nachdem ob GEMDOS vom
  413.                btst      #13,d0              ; Supervisor- oder User-modus
  414.                bne       no_super            ; aufgerufen wurde sind die
  415.                move.l    usp,a0              ; Parameter auf dem entsprechendem
  416.                bra       tst_term            ; Stack
  417. no_super:      lea.l     6(sp),a0
  418. tst_term:      cmpi.w    #Pterm0,(a0)        ; Der Overscan-Modus wird
  419.                beq       TermFound           ; NACH jedem Programm nocheinmal
  420.                cmpi.w    #Pterm,(a0)         ; neu installiert, da viele
  421.                bne       NoTerm              ; Programme den Bildschirm umsetzen
  422. TermFound:     movem.l   d0-d7/a0-a6,-(sp)   ; oder direkt beschreiben.
  423.                bsr       SetOverscan         ;
  424.                bsr       ClearScreen         ;
  425. NoClear:       movem.l   (sp)+,d0-d7/a0-a6
  426. NoTerm:        movea.l   OldDos(pc),a0
  427.                jmp       (a0)
  428. ;################################################ XBIOS-Trap
  429.                .DC.b "XBRAOVER"
  430. OldXbios:      .DC.l 0
  431. MyXbios:       move.w    TruePhys,d0
  432.                beq       No_Xbios
  433.                move.w    (sp),d0             ; Je nachdem ob XBIOS vom
  434.                btst      #13,d0              ; Supervisor- oder User-modus
  435.                bne       no_x_super          ; aufgerufen wurde sind die
  436.                move.l    usp,a0              ; Parameter auf dem entsprechendem
  437.                bra       tst_phys            ; Stack
  438. no_x_super:    lea.l     6(sp),a0
  439. tst_phys:      cmpi.w    #Physbase,(a0)      ; Beim Physbase-Aufruf wird
  440.                beq       PhysFound           ;
  441. No_Xbios:      movea.l   OldXbios(pc),a0
  442.                jmp       (a0)
  443. PhysFound:     move.l    v_bas_add,d0        ; v_bas_add zurückgegeben
  444.                rte       
  445. ;################################################ HARDCOPY-Vec
  446.                .DC.b "XBRAOVER"              ;  HARDCOPY
  447. OldHard:       .DC.l 0   ;
  448. MyHard:        move.w    #-1,-(sp)           ;   Auf Shift ALT/HELP testen
  449.                move.w    #Kbshift,-(sp)      ;
  450.                trap      #bios               ;
  451.                addq.l    #4,sp               ;
  452.                cmp.b     ActivateKey,d0      ;   ja -> eigene Routine
  453.                beq       NewHard             ;
  454.                movea.l   OldHard(pc),a0      ;   nein -> alte Routine anspringen
  455.                jmp       (a0)                ;
  456. ;------------------------------------------
  457. NewHard:       movem.l   d0-d7/a0-a6,-(sp)
  458.                bsr       SetOverscan         ;     Overscan Werte nochmal setzen
  459.                bsr       ClearScreen         ;     Bilschirmränder löschen
  460. DoNotClear:    move.w    #-1,dumpflag        ;  Hardcopy-DumpFlag löschen
  461. EndHard:       movem.l   (sp)+,d0-d7/a0-a6
  462.                rts                           ; zurück
  463. ;################################################ VBL-Vektor
  464.                .DC.b "XBRAOVER"              ; VerticalBlank nur bei BLITTER-TOS
  465.                .DC.l 0
  466. MyVB:          tst.b     GemStarted          ; Läuft GEM schon
  467.                beq.s     MyVB_1              ; nein, raus
  468.  
  469.                movea.l   _vblqueue,a0        ; in VBL-Slot 0 schon ...
  470.                tst.l     (a0)                ; ... GEM-Mausroutine installiert ?
  471.                beq.s     MyVB_1              ; nein, raus
  472.  
  473.                pea       MyMouse(pc)         ; durch eigene Mausroutine ...
  474.                move.l    (sp)+,(a0)          ; ... ersetzen
  475.  
  476. ; ???????????????????????????
  477.                movea.l   MouseVec,a0
  478.                cmpi.l    #$fcfe82,(a0)
  479.                bne.s     MyVB_1
  480.                move.w    sr,-(sp)
  481.                ori.w     #$700,sr
  482.                move.l    #$fcfe8c,(a0)
  483.                move.w    (sp)+,sr
  484. MyVB_1:        rts       
  485. ;################################################ MOUSE-Vektor
  486.                .DC.b "XBRAOVER"              ; MouseVec nur bei BLITTER-TOS
  487.                .DC.l 0
  488. MyMouse:       move.w    sr,-(sp)            ; Alte Interruptmaske merken
  489.                ori.w     #$0700,sr           ; alle Interrupts sperren
  490.  
  491.                movea.l   LineA,a0            ; Zeiger auf LineA Variablen
  492.                bclr      #0,CUR_FLAG(a0)     ; !0 -> Maus neu zeichnen ?
  493.                beq.s     MyMouse_2           ; nein, raus
  494.  
  495.                clr.l     d0
  496.                clr.l     d1
  497.                move.w    CUR_X(a0),d0        ; Maus X-Position holen
  498.                move.w    CUR_Y(a0),d1        ; Maus Y-Position holen
  499.                move.w    (sp)+,sr            ; wieder Interrupts zulassen
  500.                tst.b     MOUSE_FLAG(a0)      ; !0 -> Mausinterrupt ein ?
  501.                bne.s     MyMouse_1           ; ja, raus
  502.  
  503.                movem.w   d0/d1,-(sp)         ; Register retten
  504.  
  505.                lea.l     SAVE_LEN(a0),a2     ; Zeiger auf LineA SpriteSaveBuffer
  506.                bsr       UndrawSprite        ; Mauszeiger löschen
  507.  
  508.                movem.w   (sp)+,d0/d1         ; Register restaurieren
  509.  
  510.                movea.l   LineA,a0
  511.                lea.l     SAVE_LEN(a0),a2     ; Zeiger auf LineA SpriteSaveBuffer
  512.                lea.l     M_POS_HX(a0),a0     ; SDB-Zeiger für LineA-MausSprite
  513.                bsr       DrawSprite          ; Mauszeiger neu zeichnen
  514. MyMouse_1:     
  515.                rts                           ; raus
  516. MyMouse_2:     
  517.                move.w    (sp)+,sr            ; wieder Interrupts zulassen
  518.                rts                           ; raus
  519.  
  520.  
  521. ;#############################################################
  522. ;#
  523. ;# Die wichtigsten Unterprogramme
  524. ;# ------------------------------
  525. ;#     SetOverscan       LineA und Auflösung initialisieren
  526. ;#     ClearScreen       Nur BildschirmRänder auf Schwarz
  527. ;#     ClearFullScreen   Ganzen Bildschirmspeicher löschen
  528. ;#
  529. ;#############################################################
  530.  
  531. SetOverscan:   clr.l     d2
  532.                move.b    sshiftmd,d2         ; Aktuelle Aufösung
  533.                move.w    d2,Reso             ;    merken
  534.                add.w     d2,d2               ; mal 2 als Word-Offset in Tabelle
  535.                lea.l     ScreenTab(pc),a0    ; TabellenZeiger holen
  536.                move.w    0(a0,d2.w),RezX     ; X-Auflösung
  537.                move.w    6(a0,d2.w),RezY     ; Y-Auflösung
  538.                move.w    12(a0,d2.w),BpL     ; Bytes pro Zeile
  539.                add.w     d2,d2               ; mal 2 als Long-Offset
  540.                move.l    18(a0,d2.w),d0      ; Offset  MEMTOP <> VIDEO_ADD
  541.                move.l    30(a0,d2.w),d1      ; Offset  MEMTOP <> V_BAS_ADD
  542.                move.w    d1,Offset           ; merken
  543. ;----------------------------  Videoaddresse auf 'memtop + D0'
  544.                move.l    MyMemtop,v_bas_add
  545.                tst.b     BadTos              ; Bei BlitterTOS
  546.                beq       no_buff_1           ;     hinter Sicherheits-
  547.                addi.l    #32768,v_bas_add    ;     Puffer beginnen
  548. no_buff_1:     
  549.                add.l     d0,v_bas_add
  550.                move.b    v_bas_add+1,vid_bashigh  ; Addresse setzen
  551.                move.b    v_bas_add+2,vid_basmid
  552.                move.l    v_bas_add,VidAdd    ;       und merken
  553. ;----------------------------  v_bas_ad auf 'memtop + D1' setzen
  554.                move.l    MyMemtop,v_bas_add
  555.                tst.b     BadTos              ; Bei BlitterTOS
  556.                beq       no_buff_2           ;     hinter Sicherheitspuffer
  557.                addi.l    #32768,v_bas_add    ;
  558. no_buff_2:     
  559.                add.l     d1,v_bas_add        ;         v_bas_add setzen
  560.                move.l    v_bas_add,BasAdd    ;         und merken
  561. ;--------------- Werte in den negativen LineA Variablen anpassen
  562.                movea.l   LineA,a0            ; LineA Zeiger holen
  563.                move.w    RezX,v_rez_hz(a0)   ; Breite setzen
  564.                move.w    RezX,WKXRez(a0)     ;
  565.                subi.w    #1,WKXRez(a0)       ; Breite-1
  566.                move.w    RezY,v_rez_vt(a0)   ; Höhe   setzen
  567.                move.w    RezY,WKYRez(a0)     ;
  568.                subi.w    #1,WKYRez(a0)       ; Höhe-1
  569.                move.w    BpL,bytes_lin(a0)   ; Bytes pro Zeile setzen
  570.                move.w    BpL,width(a0)       ;
  571.                move.w    RezX,d0             ;
  572.                asr.w     #3,d0               ;
  573.                subq.w    #1,d0               ; Breite/8 -1
  574.                move.w    d0,v_cel_mx(a0)     ; -> Anzahl Buchstaben pro Zeile
  575.                clr.l     d0                  ;
  576.                move.w    RezY,d0             ;
  577.                divu.w    v_cel_ht(a0),d0     ;
  578.                subq.w    #1,d0               ; Höhe/Buchstabenhöhe -1
  579.                move.w    d0,v_cel_my(a0)     ; -> Anzahl Buchstabenzeilen
  580.                move.w    v_cel_ht(a0),d0     ;
  581.                mulu.w    BpL,d0              ; AnzBuchstaben*BytesProZeile
  582.                move.w    d0,v_cel_wr(a0)     ; -> Blocklänge für Scrolling
  583.                move.w    v_planes(a0),VPlanes     ; Anzahl der Farbebenen
  584.                tst.b     BadTos              ; BLITTER-TOS ?
  585.                beq       setLineA_1          ; nein -> fertig
  586. ;-----------------------------
  587.                move.w    #3,MonPLine
  588.                move.b    sshiftmd,d0
  589.                cmpi.b    #1,d0
  590.                bgt       setLineA_1
  591.                move.w    #2,MonPLine
  592.                tst.b     d0
  593.                bne       setLineA_1
  594.                move.w    #1,MonPLine
  595. setLineA_1:    bsr       ResetCursor         ; Neue CursorAddresse bestimmen
  596.                rts       
  597. ;-----------------------------
  598. CallSetOverscan:         
  599.                move.w    sr,d0
  600.                btst      #13,d0
  601.                beq       DoCallOver
  602.                bra       SetOverscan
  603. DoCallOver:    pea       SetOverscan(pc)     ; im
  604.                move.w    #Supexec,-(sp)      ; Supervisormodus durchführen
  605.                trap      #xbios              ;
  606.                addq.l    #6,sp
  607.                rts       
  608. ;#############################################################
  609. ClearScreen:   bsr       BlackColor          ; Löschfarbe holen in D0
  610.                move.l    d0,d4               ;
  611. ;-----------------------------
  612.                movea.l   VidAdd,a1           ; Oberen Rand löschen
  613.                movea.l   BasAdd,a0           ;
  614.                subq.l    #2,a0               ; Falls HIGH_OFF nicht /4 teilbar
  615. Hflp:          move.l    d4,(a1)+            ; Vor dem Bildschirm Rücklauf
  616.                cmpa.l    a0,a1               ; Pixel auf Schwarz setzen
  617.                blt       Hflp                ;
  618. ;-----------------------------
  619.                move.w    Reso,d5             ;
  620.                movea.l   BasAdd,a0           ; Links & Rechts im Rücklauf löschen
  621.                clr.l     d0                  ; Den ungenutzten Bereich im
  622.                clr.l     d1                  ; Rücklauf auf Schwarz setzen
  623.                move.w    BpL,d0              ; Bytes pro Zeile - Pixel/xxx
  624.                move.w    RezX,d1             ;
  625.                addq.w    #1,d5
  626.                asr.w     d5,d1               ;   >>3:High  >>2:Mid  >>1:Low
  627.                sub.w     d1,d0               ;
  628.                move.w    RezY,d2             ; Höhe des Bereichs
  629.                subq.w    #1,d2               ;
  630.                subq.w    #1,d0               ;
  631. Hlp1:          adda.l    d1,a0               ; Normalen Bildbereich überspringen
  632.                move.w    d0,d3               ;
  633. Hlp2:          move.b    d4,(a0)+            ; Bereich löschen
  634.                dbf       d3,Hlp2             ;
  635.                dbf       d2,Hlp1             ;
  636. ;-----------------------------
  637.                move.l    a0,d0               ; Unteren Bildrand löschen
  638.                bclr      #0,d0               ; Zeiger auf gerade Addresse
  639.                movea.l   d0,a0               ; bringen
  640.                move.l    MemEnd,d1           ; Anzahl der zulöschenden Blöcke
  641.                sub.l     d0,d1               ; Speicherende minus ZeigerAddr
  642.                asr.l     #4,d1               ; durch 16 (Blocklänge)
  643.                subq.l    #1,d1               ; minus 1 (wegen dbf)
  644. ;-----------------------------
  645. Hlp3:          move.l    d4,(a0)+            ; auf Schwarz löschen
  646.                move.l    d4,(a0)+            ;
  647.                move.l    d4,(a0)+            ;
  648.                move.l    d4,(a0)+            ;
  649.                dbf       d1,Hlp3             ;
  650.                rts                           ; fertig
  651. ;-----------------------------
  652. CallClearScreen:         
  653.                move.w    sr,d0
  654.                btst      #13,d0
  655.                beq       DoCallClearSc
  656.                bra       ClearScreen
  657. DoCallClearSc: pea       ClearScreen(pc)     ; im
  658.                move.w    #Supexec,-(sp)      ; Supervisormodus durchführen
  659.                trap      #xbios              ;
  660.                addq.l    #6,sp
  661.                rts       
  662. ;#############################################################
  663. ; Gesamten Bildspeicher löschen (auf schwarz)
  664. ; Löschfarbe bestimmen
  665. ClearFullScreen:         
  666.                bsr       BlackColor          ; Löschwert holen in D0
  667.                move.l    #$8000,d1           ; Länge des alten Bildschirmspeichers
  668.                addi.l    #add_len,d1         ; plus Erweiterung
  669.                lsr.l     #4,d1               ; geteilt durch 16L
  670.                subq.l    #1,d1               ; minus 1 wegen dbf
  671. ;-----------------------------
  672.                movea.l   MyMemtop,a0         ; ab MEMTOP löschen
  673.                tst.b     BadTos              ; BlitterTOS ?
  674.                beq       sc_clp              ; Sicherheitspuffer beachten
  675.                adda.l    #32768,a0           ; alte Länge
  676. ;-----------------------------
  677. sc_clp:        move.l    d0,(a0)+            ;
  678.                move.l    d0,(a0)+            ;
  679.                move.l    d0,(a0)+            ;
  680.                move.l    d0,(a0)+            ;
  681.                dbf       d1,sc_clp           ; die nächsten 16 Bytes
  682.                bsr       ResetCursor
  683.                rts                           ; fertig
  684. ;-----------------------------
  685. CallClearFull: 
  686.                move.w    sr,d0
  687.                btst      #13,d0
  688.                beq       DoCallClearFu
  689.                bra       ClearFullScreen
  690. DoCallClearFu: pea       ClearFullScreen(pc) ; im
  691.                move.w    #Supexec,-(sp)      ; Supervisormodus durchführen
  692.                trap      #xbios              ;
  693.                addq.l    #6,sp
  694.                rts       
  695. ;-----------------------------
  696. BlackColor:    move.l    #-1,d0              ; erstmal Füllwert $FFFFFFFF
  697.                move.w    Reso,d1             ; Bildschirmmodus ...
  698.                cmpi.w    #2,d1               ; ... Monochrom ?
  699.                bne       NotWhite            ; nein, weiter
  700.                btst      #0,$ff8241          ; Inverse Monochrome ?
  701.                bne       NotWhite            ; nein, Farbe richtig
  702.                not.l     d0                  ; sonst Füllwert $0
  703. NotWhite:      rts       
  704. ;-----------------------------
  705. CallBlackColor:          
  706.                move.w    sr,d0
  707.                btst      #13,d0
  708.                beq       DoCallBlackCo
  709.                bra       BlackColor
  710. DoCallBlackCo: pea       BlackColor(pc)      ; im
  711.                move.w    #Supexec,-(sp)      ; Supervisormodus durchführen
  712.                trap      #xbios              ;
  713.                addq.l    #6,sp
  714.                rts       
  715. ;#############################################################
  716. ; Retten des alten SchirmInhaltes in den neuen OVERSCAN Bildschirm
  717. ;
  718. ScreenSave:    movem.l   d0-d7/a0-a6,-(sp)   ;
  719.                movea.l   StartBasAdd,a0      ; Bildschirmspeicher kurz
  720.                movea.l   MyMemtop,a1         ; vor MemTop kopieren !
  721.                suba.l    #$8000,a1           ;
  722.                move.l    #1000,d0
  723. ScSaveLoop:    movem.l   (a0)+,d1-d7/a2
  724.                movem.l   d1-d7/a2,(a1)
  725.                lea.l     32(a1),a1           ; 32 Bytes transportieren
  726.                dbf       d0,ScSaveLoop
  727.                movem.l   (sp)+,d0-d7/a0-a6
  728.                rts       
  729. ;---------------------------------------------------------
  730. ScreenCopy:    movem.l   d0-d7,-(sp)         ;
  731.                movea.l   BasAdd,a0           ; Bildschirmspeicher wieder
  732.                movea.l   MyMemtop,a1         ; zurückkopieren
  733.                suba.l    #$8000,a1           ;
  734.                move.w    #160,d0             ; Alte Breite in BYTE D0
  735.                move.w    #200,d1             ; Alte Höhe            D1
  736.                cmpi.w    #2,Reso             ;
  737.                bne       CopyNoHigh          ;
  738.                move.w    #80,d0              ; High-Reso
  739.                move.w    #400,d1             ;
  740. CopyNoHigh:    clr.l     d2                  ;
  741.                move.w    BpL,d2              ; Neue Bytes Pro Line  D3
  742.                sub.w     d0,d2               ; Differenz Neue-Alte
  743.                asr.w     #2,d0               ; /4 -> Longs
  744.                subq.w    #1,d0               ; wegen dbf -> LONGs to copy
  745.                subq.w    #1,d1               ; Lines to Copy
  746.                subq.w    #1,d2               ; Rest zu löschen
  747.  
  748. CopyLoop:      move.w    d0,d3               ;
  749. Copy_1:        move.l    (a1)+,(a0)+         ; Alten Schirm kopieren
  750.                dbf       d3,Copy_1           ;
  751.                move.w    d2,d3               ;
  752. Copy_2:        clr.b     (a0)+               ;
  753.                dbf       d3,Copy_2           ; Zeile bis Ende löschen
  754.                dbf       d1,CopyLoop         ;
  755.  
  756.                bsr       CallClearScreen
  757.                bsr       ResetCursor         ; CursorAddr bestimmen
  758.                movem.l   (sp)+,d0-d7
  759.                rts       
  760. ;#####################################################################
  761. ; Neue CursorAddresse bestimmen
  762. ;
  763. ResetCursor:   movea.l   LineA,a0            ;
  764.                move.l    BasAdd,v_cur_add(a0)     ;  Neue Addresse
  765.                move.w    v_cur_y(a0),d0      ;    = V_bas_add
  766.                mulu.w    v_cel_wr(a0),d0     ;
  767.                add.l     d0,v_cur_add(a0)    ;      + y * cel_wr
  768.                move.w    v_cur_x(a0),d0      ;
  769.                bclr.l    #0,d0               ;      + x^1 * v_planes
  770.                mulu.w    v_planes(a0),d0     ;
  771.                add.l     d0,v_cur_add(a0)    ;      + x^1 * planes
  772.                move.w    v_cur_x(a0),d0      ;
  773.                andi.l    #$fffe,d0           ;
  774.                add.w     d0,v_cur_add(a0)    ;      + x&1
  775.                clr.l     d0                  ;
  776.                move.w    v_cur_of(a0),d0     ;
  777.                add.l     d0,v_cur_add(a0)    ;      + cursor_offset
  778.                rts       
  779. ;#############################################################
  780. ;#
  781. ;# INTRO GrowBox Effekt und Sound
  782. ;#
  783. ;#############################################################
  784.  
  785. Intro:         bsr       ScreenSave
  786.                pea       SoundTab(pc)        ; Sound abspielen
  787.                move.w    #Dosound,-(sp)
  788.                trap      #xbios
  789.                addq.l    #6,sp
  790. ;-----------------------------
  791.                clr.w     d0
  792.                bsr       set_color
  793.                move.w    Reso,d5             ; Aktuelle Aufösung
  794.                add.w     d5,d5               ; mal 2 als Word-Offset in Tabelle
  795.                lea.l     ScreenTab(pc),a0
  796.                move.w    RezX,d6             ; D6 = (Breite - AlteBreite)/2
  797.                cmp.w     42(a0,d5.w),d6      ; Neue Breite kleiner als Alte ?
  798.                blt       EndIntro            ;     ja -> Nur Schirm kopieren
  799.                sub.w     42(a0,d5.w),d6
  800.                asr.w     #1,d6
  801.                move.w    d6,d0               ; als X1
  802.                move.w    d0,d2
  803.                add.w     42(a0,d5.w),d2      ; X2 = X1 + AlteAuflösung
  804.                move.w    RezY,d7             ; D7 = (Höhe   - AlteHöhe  )/2
  805.                cmp.w     48(a0,d5.w),d7      ; Neue Höhe kleiner als Alte ?
  806.                blt       EndIntro            ;     ja -> Nur Schirm kopieren
  807.                sub.w     48(a0,d5.w),d7
  808.                asr.w     #1,d7
  809.                move.w    d7,d1               ; als Y1
  810.                move.w    d1,d3
  811.                add.w     48(a0,d5.w),d3      ; Y2 = Y1 + AlteAuflösung
  812.                move.w    d6,Dx               ; Alle Werte abspeichern
  813.                move.w    d7,Dy               ;
  814.                move.w    d0,Xa               ;
  815.                move.w    d1,Ya               ;
  816.                move.w    d2,Xe               ;
  817.                move.w    d3,Ye               ;
  818.  
  819.                movem.l   d0-d7/a0-a6,-(sp)
  820.                bsr       CallClearFull
  821.                movem.l   (sp)+,d0-d7/a0-a6
  822.  
  823.                bsr       draw_rect           ; Das gefüllte Rechteck zeichnen
  824. ;-------------------------------------------------------------
  825.                move.w    d6,Max              ; In welche Richtung ist der
  826.                cmp.w     d6,d7               ; Zugewinn am größten ?
  827.                blt       grow_box            ;
  828.                move.w    d7,Max              ;
  829. grow_box:      move.w    #1,d6               ; Zaehler
  830. grow_loop:     
  831.                clr.w     d7                  ; Schleife für die größer werdenden
  832.                move.w    Dx,d4               ; Rechtecke. Die Bewegung soll
  833.                mulu.w    d6,d4               ; proportional verlaufen...
  834.                divu.w    Max,d4              ; ...deswegen der ganze Hermann
  835.                move.w    Dy,d5               ;
  836.                mulu.w    d6,d5
  837.                divu.w    Max,d5
  838.  
  839.                cmpi.w    #0,d0               ; X links oben
  840.                beq       no_d0
  841.                move.w    Xa,d0
  842.                sub.w     d4,d0
  843.                addq.w    #1,d7
  844. no_d0:         cmpi.w    #0,d1               ; Y links oben
  845.                beq       no_d1
  846.                move.w    Ya,d1
  847.                sub.w     d5,d1
  848.                addq.w    #1,d7
  849. no_d1:         cmp.w     RezX,d2             ; X rechts unten
  850.                beq       no_d2
  851.                move.w    Xe,d2
  852.                add.w     d4,d2
  853.                addq.w    #1,d7
  854. no_d2:         cmp.w     RezY,d3             ; Y rechts unten
  855.                beq       no_d3
  856.                move.w    Ye,d3
  857.                add.w     d5,d3
  858.                addq.w    #1,d7
  859. no_d3:         bsr       draw_box            ; das Rechteck zeichnen
  860. ;-----------------------------
  861.                addq.w    #1,d6               ;
  862.                tst.w     d7                  ; Solange sich noch was ändert
  863.                bne       grow_loop           ; die Rechteckschleife wiederholen
  864.  
  865. EndIntro:      bsr       ResetCursor
  866.                bra       ScreenCopy
  867.  
  868. ;-----------------------------
  869. set_color:     movea.l   LineA,a0            ; Farbe setzen
  870.                move.w    d0,col_bit0(a0)     ;
  871.                move.w    d0,col_bit1(a0)     ;
  872.                move.w    d0,col_bit2(a0)     ;
  873.                move.w    d0,col_bit3(a0)     ;
  874.                rts       
  875. ;---------------------------------
  876. draw_box:      movea.l   LineA,a0            ; Ein Rechteck aus Linien zeichnen
  877.                clr.w     wmode(a0)           ; d0/d1 linke  obere  Ecke
  878.                move.w    #$ffff,lnmask(a0)   ; d2/d3 rechte untere Ecke
  879.                move.w    #1,lstlin(a0)
  880.                move.w    d0,x1(a0)
  881.                move.w    d1,y1(a0)
  882.                move.w    d2,x2(a0)
  883.                move.w    d1,y2(a0)
  884.                bsr       draw_line           ; Oben
  885.                movea.l   LineA,a0
  886.                move.w    d2,x1(a0)
  887.                move.w    d1,y1(a0)
  888.                move.w    d2,x2(a0)
  889.                move.w    d3,y2(a0)
  890.                bsr       draw_line           ; Rechts
  891.                movea.l   LineA,a0
  892.                move.w    d2,x1(a0)
  893.                move.w    d3,y1(a0)
  894.                move.w    d0,x2(a0)
  895.                move.w    d3,y2(a0)
  896.                bsr       draw_line           ; Unten
  897.                movea.l   LineA,a0
  898.                move.w    d0,x1(a0)
  899.                move.w    d1,y1(a0)
  900.                move.w    d0,x2(a0)
  901.                move.w    d3,y2(a0)
  902.                bsr       draw_line           ; Links
  903.                rts       
  904. ;-----------------------------
  905. draw_diag:     movea.l   LineA,a0            ; Diagonalen zeichnen
  906.                move.w    d0,x1(a0)           ;
  907.                move.w    d1,y1(a0)           ; Parameter wie oben
  908.                move.w    d2,x2(a0)           ;
  909.                move.w    d3,y2(a0)
  910.                bsr       draw_line           ; Diagonale links
  911.                movea.l   LineA,a0
  912.                move.w    d2,x1(a0)
  913.                move.w    d1,y1(a0)
  914.                move.w    d0,x2(a0)
  915.                move.w    d3,y2(a0)
  916.                bsr       draw_line           ; Diagonale rechts
  917. EndBox:        rts       
  918. ;-----------------------------
  919. draw_line:     movem.l   d0-d7,-(sp)         ; Einzelne Linie Ziehen
  920.                .DC.w $a003
  921.                movem.l   (sp)+,d0-d7
  922.                rts       
  923. ;-----------------------------
  924. pattern:       .DC.w $ffff                   ; Fuellmuster
  925. ;-----------------------------
  926. draw_rect:     movem.l   d0-d7,-(sp)         ; Ein Rechteck zeichnen
  927.                movea.l   LineA,a0            ;
  928.                move.w    #1,mfill(a0)        ; d0/d1 linke  obere  Ecke
  929.                clr.w     wmode(a0)           ; d2/d3 rechte untere Ecke
  930.                move.w    d0,x1(a0)
  931.                move.w    d1,y1(a0)
  932.                move.w    d2,x2(a0)
  933.                move.w    d3,y2(a0)
  934.                lea.l     pattern(pc),a1
  935.                move.l    a1,patptr(a0)
  936.                move.w    #1,patmsk(a0)
  937.                clr.w     clip(a0)
  938.                .DC.w $a005
  939.                movem.l   (sp)+,d0-d7
  940.                rts       
  941.  
  942. ;#############################################################
  943. ;#
  944. ;# OVERSCAN - Einstellung
  945. ;#
  946. ;#############################################################
  947.  
  948. UserInstall:   bsr       UserInit            ; Initialisieren
  949. UserLoop:      move.w    #0,d0               ; Wiederhole
  950.                bsr       DrawSetup           ;
  951.                bsr       WriteSetup          ;     Zeichne Kreuz und Werte
  952.                bsr       GetKey              ;     Hole Taste
  953.                move.w    #1,d0               ;
  954.                bsr       DrawSetup           ;     Lösche Kreuz
  955.                bsr       ChangeSetup         ;     Bearbeite Taste
  956.                tst.w     UserSave            ;
  957.                beq       UserLoop            ; Bis EndeFlag gesetzt
  958.                bra       UserExit            ; Meldung ausgeben
  959. ;------------------------------------------------------------
  960. UserInit:      bsr       CallClearFull       ; Schirm löschen
  961.                bsr       CallClearPal        ; Farbregister 3 löschen
  962.                move.w    Reso,ResoSave       ; Startauflösung merken
  963.                bsr       InitReso
  964.                clr.w     UserSave
  965.                bsr       Do_Help             ; HilfsText
  966.                bra       CallClearFull       ; und wieder schwarz
  967. ;--------------------------------------------
  968. UserExit:      pea       msg_erase(pc)       ; Bildschirm löschen & CursorHome
  969.                move.w    #Cconws,-(sp)       ;
  970.                trap      #gemdos             ;
  971.                addq.l    #6,sp               ;
  972.                move.w    UserSave,d0
  973.                cmpi.w    #1,d0               ; 1 -> Nicht gespeichert
  974.                bne       tstNotFound
  975.                pea       msg_nosave(pc)      ;
  976.                move.w    #Cconws,-(sp)
  977.                trap      #gemdos
  978.                addq.l    #6,sp
  979.                bra       UserContinue
  980. ;----------------------
  981. tstNotFound:   cmpi.w    #2,d0               ; 2 -> Datei nicht gefunden
  982.                bne       Saved               ;
  983.                pea       save_name(pc)       ; Datei-Name ausgeben
  984.                move.w    #Cconws,-(sp)       ;
  985.                trap      #gemdos             ;
  986.                addq.l    #6,sp               ;
  987.                pea       msg_notfound(pc)    ;
  988.                move.w    #Cconws,-(sp)
  989.                trap      #gemdos
  990.                addq.l    #6,sp
  991.                move.w    #Cnecin,-(sp)       ; Tastendruck abwarten
  992.                trap      #gemdos
  993.                addq.l    #2,sp
  994.                bra       UserContinue
  995. ;--------------------------
  996. Saved:         pea       msg_save(pc)        ; 3 -> Alles gespeichert
  997.                move.w    #Cconws,-(sp)
  998.                trap      #gemdos
  999.                addq.l    #6,sp
  1000. UserContinue:  move.w    Reso,d0
  1001.                cmp.w     ResoSave,d0
  1002.                bne       NoRestorePal
  1003.                bsr       CallRestorePal      ; Farbregister 3 zurück
  1004. NoRestorePal:  rts       
  1005. ;-----------------------------
  1006. GetKey:        move.w    #Cnecin,-(sp)
  1007.                trap      #gemdos
  1008.                addq.l    #2,sp
  1009.                swap.w    d0                  ; ScanCode
  1010.                move.w    d0,UserKey
  1011.                rts       
  1012. ;-----------------------------
  1013. ChangeSetup:   move.w    UserKey,d0          ; Auf Tastendruck reagieren
  1014.                cmpi.w    #16,d0              ; Q
  1015.                bne       NoQ
  1016.                move.w    #1,UserSave
  1017.                bra       ChangeClear
  1018. NoQ:           cmpi.w    #31,d0              ; S
  1019.                bne       NoS
  1020.                bra       Do_Save
  1021. NoS:           cmpi.w    #98,d0              ; Help
  1022.                bne       NoHelp
  1023.                bsr       Do_Help
  1024.                bra       ChangeClear
  1025. NoHelp:        cmpi.w    #75,d0              ; LinksPfeil
  1026.                bne       NoLeft
  1027.                bra       Do_Left
  1028. NoLeft:        cmpi.w    #77,d0              ; RechtsPfeil
  1029.                bne       NoRight
  1030.                bra       Do_Right
  1031. NoRight:       cmpi.w    #72,d0              ; RaufPfeil
  1032.                bne       NoUp
  1033.                bra       Do_Up
  1034. NoUp:          cmpi.w    #80,d0              ; RunterPfeil
  1035.                bne       NoDown
  1036.                bra       Do_Down
  1037. NoDown:        cmpi.w    #101,d0             ; /
  1038.                bne       NoDiv
  1039.                bsr       Do_Div
  1040.                bra       ChangeClear
  1041. NoDiv:         cmpi.w    #102,d0             ; *
  1042.                bne       NoMul
  1043.                bsr       Do_Mul
  1044.                bra       ChangeClear
  1045. NoMul:         cmpi.w    #74,d0              ; -
  1046.                bne       NoSub
  1047.                bsr       Do_Sub
  1048.                bra       ChangeClear
  1049. NoSub:         cmpi.w    #78,d0              ; +
  1050.                bne       NoAdd
  1051.                bsr       Do_Add
  1052.                bra       ChangeClear
  1053. NoAdd:         cmpi.w    #25,d0              ; P
  1054.                bne       NoP
  1055.                bsr       Do_Phys
  1056.                bra       ChangeClear
  1057. NoP:           cmpi.w    #46,d0              ; C
  1058.                bne       NoC
  1059.                bsr       Do_Activ
  1060.                bra       ChangeClear
  1061. NoC:           cmpi.w    #35,d0              ; H
  1062.                bne       NoH
  1063.                bsr       ResoChangeTest
  1064.                bne       ChangeClear
  1065.                move.w    #2,d0
  1066.                bra       SetScreenReso
  1067. NoH:           cmpi.w    #50,d0              ; M
  1068.                bne       NoM
  1069.                bsr       ResoChangeTest
  1070.                bne       ChangeClear
  1071.                move.w    #1,d0
  1072.                bra       SetScreenReso
  1073. NoM:           cmpi.w    #38,d0              ; L
  1074.                bne       EndChange
  1075.                bsr       ResoChangeTest
  1076.                bne       ChangeClear
  1077.                move.w    #0,d0
  1078.                bra       SetScreenReso
  1079.  
  1080. EndChange:     rts       
  1081. ChangeClear:   bra       CallClearFull
  1082. ;----------------------------------------------
  1083. ClearPal:      move.w    vid_pal3,Pal3Save   ; Farbregister 3 retten
  1084.                move.w    vid_palF,PalFSave
  1085.                clr.w     vid_pal3            ; auf schwarz setzen
  1086.                clr.w     vid_palF
  1087.                rts       
  1088. CallClearPal:  move.w    sr,d0
  1089.                btst      #13,d0
  1090.                beq       DoCallClearPa
  1091.                bra       ClearPal
  1092. DoCallClearPa: pea       ClearPal(pc)        ; Farbregister 3 löschen
  1093.                move.w    #Supexec,-(sp)      ; Supervisormodus durchführen
  1094.                trap      #xbios              ;
  1095.                addq.l    #6,sp
  1096.                rts       
  1097. ;----------------------------------------------
  1098. RestorePal:    move.w    Pal3Save,vid_pal3   ; Farbregister 3 zurück
  1099.                move.w    PalFSave,vid_palF
  1100.                rts       
  1101. CallRestorePal:          
  1102.                move.w    sr,d0
  1103.                btst      #13,d0
  1104.                beq       DoCallRestore
  1105.                bra       RestorePal
  1106. DoCallRestore: pea       RestorePal(pc)      ; Farbregister 3 löschen
  1107.                move.w    #Supexec,-(sp)      ; Supervisormodus durchführen
  1108.                trap      #xbios              ;
  1109.                addq.l    #6,sp
  1110.                rts       
  1111. ;----------------------------------------------
  1112. InitReso:      move.w    #8,Y_Inc
  1113.                move.w    Reso,d0             ; Aktuelle Auflösung
  1114.                cmpi.w    #2,d0               ;
  1115.                bne       NoHighReso          ;
  1116.                move.w    #16,Y_Inc           ;     Y-Inkrement feststellen
  1117. ;-----------------------------
  1118. NoHighReso:    move.l    #8,d1               ;
  1119.                tst.w     d0
  1120.                beq       InitOffset
  1121.                asr.l     d0,d1               ;
  1122. InitOffset:    move.l    d1,Off_Inc          ;     Offset-Inkrement festlegen
  1123. ;-----------------------------
  1124.                clr.l     d1                  ;     Max X/Y feststellen
  1125.                move.w    d0,d1               ;
  1126.                addq.w    #1,d1               ;
  1127.                move.w    #1,d2               ;
  1128.                asl.w     d1,d2               ; 1 << (Reso+)
  1129.                mulu.w    BpL,d2              ;
  1130.                move.w    d2,X_Max            ; MaxX = Bpl * 1<<(Reso+1)
  1131.                move.l    MemEnd,d1           ;
  1132.                sub.l     MyMemtop,d1         ;
  1133.                divu.w    BpL,d1              ; MaxY = Speicherlänge/BytePerLine
  1134.                move.w    d1,Y_Max            ;
  1135.                move.w    #320,X_Min          ;
  1136.                move.w    #160,Y_Min          ;
  1137.                cmpi.w    #2,d0               ;
  1138.                bne       InitPointer         ;
  1139.                move.w    #320,Y_Min          ;
  1140. ;-----------------------------
  1141. InitPointer:   add.w     d0,d0               ; Words
  1142.                lea.l     ScreenTab(pc),a0    ;     Breite/Höhe/Offset Pointer
  1143.                lea.l     0(a0,d0.w),a1       ;     ermitteln
  1144.                move.l    a1,X_Add
  1145.                lea.l     6(a0,d0.w),a1
  1146.                move.l    a1,Y_Add
  1147.                add.w     d0,d0               ; Longs
  1148.                lea.l     30(a0,d0.w),a1
  1149.                move.l    a1,Off_Add
  1150.                rts       
  1151. ;-----------------------------
  1152. Do_Save:       bsr       CallClearFull       ; Schirm löschen
  1153.                move.w    #2,UserSave         ; Nicht gefunden Flag setzen
  1154.  
  1155.  
  1156.                move.w    #1,-(sp)            ; Fopen('\AUTO\OVERSCAN.PRG',1)
  1157.                pea       save_name(pc)       ;
  1158.                move.w    #Fopen,-(sp)
  1159.                trap      #gemdos             ;
  1160.                addq.l    #8,sp               ;
  1161.                tst.w     d0                  ; Gefunden ?
  1162.                bmi       EndSave             ; nein -> ende
  1163.                move.w    #3,UserSave         ; Flag setzen...
  1164.                move.w    d0,Handle           ; Dateihandle merken
  1165.                clr.w     -(sp)               ;
  1166.                move.w    Handle,-(sp)        ;     Header überlesen
  1167.                move.l    #30,-(sp)           ;
  1168.                move.w    #Fseek,-(sp)        ; Fseek(30,Handle,0)
  1169.                trap      #gemdos             ;
  1170.                lea.l     $a(sp),sp           ;
  1171.                pea       ScreenTab(pc)       ;     ScreenTab speichern
  1172.                move.l    #60,-(sp)           ;
  1173.                move.w    Handle,-(sp)        ;
  1174.                move.w    #Fwrite,-(sp)       ; Fwrite(Handle,60L,ScreenTab)
  1175.                trap      #gemdos             ;
  1176.                lea.l     $c(sp),sp           ;
  1177.                move.w    Handle,-(sp)        ;
  1178.                move.w    #Fclose,-(sp)       ; Fclose(Handle)
  1179.                trap      #gemdos             ;
  1180.                addq.l    #4,sp               ;
  1181. EndSave:       rts       
  1182. ;----------------------------------------------------
  1183. Do_Help:       pea       msg_help(pc)        ; Hilfstext ausgeben
  1184.                move.w    #Cconws,-(sp)
  1185.                trap      #gemdos
  1186.                addq.l    #6,sp
  1187.                move.w    #Cnecin,-(sp)
  1188.                trap      #gemdos
  1189.                addq.l    #2,sp               ; Tastendruck abwarten
  1190.                rts       
  1191. ;-----------------------------
  1192. Do_Left:       move.w    X_Min,d0            ; Breite vermindern
  1193.                cmp.w     RezX,d0
  1194.                bge       End_Left
  1195.                movea.l   X_Add,a0
  1196.                subi.w    #16,(a0)
  1197.                bsr       CallSetOverscan
  1198. End_Left:      rts       
  1199. ;-----------------------------
  1200. Do_Right:      move.w    X_Max,d0            ; Breite erhöhen
  1201.                cmp.w     RezX,d0
  1202.                ble       End_Right
  1203.                movea.l   X_Add,a0
  1204.                addi.w    #16,(a0)
  1205.                bsr       CallSetOverscan
  1206. End_Right:     rts       
  1207. ;-----------------------------
  1208. Do_Up:         move.w    Y_Min,d0            ; Höhe vermindern
  1209.                cmp.w     RezY,d0
  1210.                bge       End_Up
  1211.                movea.l   Y_Add,a0
  1212.                move.w    Y_Inc,d0
  1213.                sub.w     d0,(a0)
  1214.                bsr       CallSetOverscan
  1215. End_Up:        rts       
  1216. ;-----------------------------
  1217. Do_Down:       move.w    Y_Max,d0            ; Höhe erhöhen
  1218.                cmp.w     RezY,d0
  1219.                ble       End_Down
  1220.                movea.l   Y_Add,a0
  1221.                move.w    Y_Inc,d0
  1222.                add.w     d0,(a0)
  1223.                bsr       CallSetOverscan
  1224. End_Down:      rts       
  1225. ;-----------------------------
  1226. Do_Div:        movea.l   Off_Add,a0          ; Offset vermindern
  1227.                move.l    Off_Inc,d0          ; Linke obere Ecke nach links
  1228.                sub.l     d0,(a0)
  1229.                bra       CallSetOverscan
  1230. ;-----------------------------
  1231. Do_Mul:        movea.l   Off_Add,a0          ; Offset erhöhen
  1232.                move.l    Off_Inc,d0          ; Linke obere Ecke nach rechts
  1233.                add.l     d0,(a0)
  1234.                bra       CallSetOverscan
  1235. ;-----------------------------
  1236. Do_Sub:        movea.l   Off_Add,a0          ; Offset erhöhen
  1237.                clr.l     d0
  1238.                move.w    BpL,d0              ; Linke obere Ecke nach oben
  1239.                sub.l     d0,(a0)
  1240.                bra       CallSetOverscan
  1241. ;-----------------------------
  1242. Do_Add:        movea.l   Off_Add,a0          ; Offset erhöhen
  1243.                clr.l     d0
  1244.                move.w    BpL,d0              ; Linke obere Ecke nach unten
  1245.                add.l     d0,(a0)
  1246.                bra       CallSetOverscan
  1247. ;-----------------------------
  1248. Do_Phys:       move.w    TruePhys,d0         ; Den jetzigen Zustand ausgeben
  1249.                tst.w     d0
  1250.                bne       PhysIsOn
  1251.                pea       msg_phys_on(pc)
  1252.                bra       Write_phys
  1253. PhysIsOn:      pea       msg_phys_off(pc)
  1254. Write_phys:    move.w    #Cconws,-(sp)
  1255.                trap      #gemdos
  1256.                addq.l    #6,sp
  1257.                move.w    #Cnecin,-(sp)
  1258.                trap      #gemdos
  1259.                addq.l    #2,sp
  1260.                swap.w    d0
  1261.                cmpi.w    #44,d0              ; Nur bei 'Y'
  1262.                bne       EndPhys
  1263.                not.w     TruePhys            ; -> Zustand ändern
  1264. EndPhys:       rts       
  1265. ;-----------------------------
  1266. Do_Activ:      move.b    ActivateKey,d0      ; Den jetzigen Zustand ausgeben
  1267.                cmpi.b    #9,d0
  1268.                beq       ActivShift
  1269.                pea       msg_shift_off(pc)
  1270.                bra       Write_Shift
  1271. ActivShift:    pea       msg_shift_on(pc)
  1272. Write_Shift:   move.w    #Cconws,-(sp)
  1273.                trap      #gemdos
  1274.                addq.l    #6,sp
  1275.                move.w    #Cnecin,-(sp)
  1276.                trap      #gemdos
  1277.                addq.l    #2,sp
  1278.                swap.w    d0
  1279.                cmpi.w    #49,d0              ; Nur bei 'N'
  1280.                bne       EndShift
  1281.                bchg      #0,ActivateKey      ; Zustand ändern
  1282. EndShift:      rts       
  1283.  
  1284. ;-----------------------------
  1285. ResoChangeTest:          
  1286.                pea       msg_change(pc)      ; Hilfstext ausgeben
  1287.                move.w    #Cconws,-(sp)
  1288.                trap      #gemdos
  1289.                addq.l    #6,sp
  1290.                move.w    #Cnecin,-(sp)
  1291.                trap      #gemdos
  1292.                addq.l    #2,sp
  1293.                swap.w    d0
  1294.                cmpi.w    #44,d0
  1295.                rts       
  1296. ;-----------------------------
  1297. SetScreenReso: move.w    d0,-(sp)            ; Neue Auflösung mit Setscreen
  1298.                move.l    #-1,-(sp)           ; setzen
  1299.                move.l    #-1,-(sp)           ;
  1300.                move.w    #Setscreen,-(sp)    ;
  1301.                trap      #xbios              ;
  1302.                lea.l     $c(sp),sp
  1303.                bsr       CallSetOverscan     ; Overscan neu installieren
  1304.                bsr       CallClearFull       ;
  1305.                bra       InitReso            ; und initialisieren
  1306. ;-----------------------------
  1307. DrawSetup:     bsr       set_color           ;  Box mit Diagonalen zeichnen
  1308.                move.w    #0,d0
  1309.                move.w    #0,d1
  1310.                move.w    RezX,d2
  1311.                subq.w    #1,d2
  1312.                move.w    RezY,d3
  1313.                subq.w    #1,d3
  1314.                bsr       draw_box
  1315.                bra       draw_diag
  1316. ;-----------------------------
  1317. WriteSetup:    lea.l     user_x(pc),a1       ;  Zahlenwerte schreiben
  1318.                move.w    RezX,d0
  1319.                bsr       WriteDec
  1320.                lea.l     user_y(pc),a1
  1321.                move.w    RezY,d0
  1322.                bsr       WriteDec
  1323.                lea.l     user_off(pc),a1
  1324.                move.w    Offset,d0
  1325.                bra       WriteHex
  1326. ;-----------------------------
  1327. WriteDec:      movem.l   d0-d7,-(sp)         ; Zahlen ausgabe in Dezimal
  1328.                lea.l     end_number(pc),a0   ; Alten String löschen
  1329.                move.w    #3,d2               ;
  1330. WriteClr:      move.b    #' ',-(a0)          ;
  1331.                dbf       d2,WriteClr         ;
  1332.                lea.l     end_number(pc),a0   ;
  1333.                swap.w    d0                  ; Oberen Werte löschen
  1334.                clr.w     d0
  1335.                swap.w    d0
  1336. WriteLp:       divu.w    #10,d0
  1337.                swap.w    d0
  1338.                move.w    d0,d1
  1339.                clr.w     d0                  ; Modulo Rest löschen
  1340.                swap.w    d0
  1341.                addi.w    #'0',d1
  1342.                move.b    d1,-(a0)
  1343.                tst.l     d0
  1344.                bne       WriteLp
  1345. ;-----------------------------
  1346.                move.l    a1,-(sp)            ; Text ausgeben
  1347.                move.w    #Cconws,-(sp)
  1348.                trap      #gemdos
  1349.                addq.l    #6,sp
  1350.                pea       user_number(pc)     ; Zahlzeile ausgeben
  1351.                move.w    #Cconws,-(sp)
  1352.                trap      #gemdos
  1353.                addq.l    #6,sp
  1354.                movem.l   (sp)+,d0-d7
  1355.                rts       
  1356. ;-----------------------------
  1357. WriteHex:      movem.l   d0-d7,-(sp)         ; Zahlen Ausgabe in Hexadezimal
  1358.                lea.l     end_number(pc),a0   ; Alten String löschen
  1359.                move.w    #3,d2
  1360. WriteHlp:      move.b    d0,d1
  1361.                andi.w    #$f,d1
  1362.                cmpi.w    #9,d1
  1363.                ble       NotAF
  1364.                subi.w    #10,d1
  1365.                addi.w    #'A',d1
  1366.                bra       WriteIt
  1367. NotAF:         addi.w    #'0',d1
  1368. WriteIt:       move.b    d1,-(a0)
  1369.                asr.w     #4,d0
  1370.                dbf       d2,WriteHlp
  1371. ;-----------------------------
  1372.                move.l    a1,-(sp)            ; Text ausgeben
  1373.                move.w    #Cconws,-(sp)
  1374.                trap      #gemdos
  1375.                addq.l    #6,sp
  1376.                pea       user_number(pc)     ; Zahlzeile ausgeben
  1377.                move.w    #Cconws,-(sp)
  1378.                trap      #gemdos
  1379.                addq.l    #6,sp
  1380.                movem.l   (sp)+,d0-d7
  1381.                rts       
  1382. ;#############################################################
  1383. ; eigene Versionen der DrawSprite und UndrawSprite Routinen
  1384. ; die nicht auf 32KB Bildschirmspeicher begrenzt sind.
  1385. ;
  1386. ; mit einigen Anpassungen für OVERSCAN
  1387. ; von Bernd Gebauer 31.05.89
  1388. ;
  1389.  
  1390. DrawSprite:    
  1391. ; Parameter
  1392. ; D0.W : X-Koordinate des Aktionspunktes des Sprites auf Schirm
  1393. ; D1.W : Y-Koordinate
  1394. ; A0   : Zeiger auf SDB-Struktur
  1395. ; A2   : Zeiger auf Sprite-Save-Buffer ( #Farbebenen*64 + 10 )
  1396.  
  1397.                move.w    6(a0),-(sp)         ; bgcol retten
  1398.                move.w    8(a0),-(sp)         ; fgcol retten
  1399.  
  1400.                clr.w     d2
  1401.                tst.w     4(a0)               ; form ( 1=VDI , -1=XOR )
  1402.                bge.s     lab_1
  1403.                moveq.l   #16,d2
  1404. lab_1:         
  1405.                move.w    d2,-(sp)            ; offset retten
  1406.  
  1407.                clr.w     d2
  1408.                bclr      #1,6(a2)
  1409.                sub.w     0(a0),d0            ; X -= xhot
  1410.                bcs.s     lab_2
  1411.  
  1412.                move.w    RezX,d3
  1413.                subi.w    #15,d3
  1414.                cmp.w     d3,d0               ; xhot > XRez-15 ?
  1415.                bhi.s     lab_4               ; ja, weiter
  1416.                bset      #1,6(a2)            ; Clipflag setzen
  1417.                bra.s     lab_3
  1418. ;-------------
  1419. lab_2:         
  1420.                addi.w    #16,d0
  1421.                moveq.l   #8,d2
  1422.                bra.s     lab_3
  1423. ;-------------
  1424. lab_4:         
  1425.                moveq.l   #16,d2
  1426. lab_3:         
  1427.  
  1428.                sub.w     2(a0),d1            ; Y -= yhot
  1429.  
  1430.                lea.l     10(a0),a0           ; Zeiger auf Sprite-Image 32Bytes
  1431.                bcs.s     lab_5
  1432.  
  1433.                move.w    RezY,d3
  1434.                subi.w    #15,d3
  1435.                cmp.w     d3,d1               ;
  1436.                bhi.s     lab_6
  1437.                moveq.l   #16,d5
  1438.                bra.s     lab_7
  1439. ;-------------
  1440. lab_5:         
  1441.                move.w    d1,d5
  1442.                addi.w    #16,d5
  1443.                asl.w     #2,d1
  1444.                suba.w    d1,a0
  1445.                clr.w     d1
  1446.                bra.s     lab_7
  1447. ;-------------
  1448. lab_6:         
  1449.                move.w    RezY,d5
  1450.                sub.w     d1,d5
  1451.                addq.w    #1,d5
  1452. lab_7:         
  1453. ; D0 = X , D1 = Y
  1454.                bsr       CalcScreenPos
  1455. ; D0 = X mod 15 , D1.L = offset vom Bildschirmanfang
  1456.  
  1457.                movea.l   v_bas_add,a1        ; Bildspeicheradresse
  1458.                adda.l    d1,a1               ; + offset
  1459.  
  1460.                lea.l     func_2,a3
  1461.                move.w    d0,d6               ; X mod 15
  1462.                cmpi.w    #8,d6               ; (X mod 15) < 8 ?
  1463.                bcs.s     lab_8               ; ja, weiter
  1464.                lea.l     func_1,a3
  1465.                move.w    #16,d6
  1466.                sub.w     d0,d6               ; 16 - (X mod 15)
  1467. lab_8:         
  1468.  
  1469.                movea.l   tab1(pc,d2.w),a5
  1470.                movea.l   tab1+4(pc,d2.w),a6
  1471.                move.w    VPlanes,d2
  1472.                move.w    d2,d3
  1473.                add.w     d3,d3
  1474.                move.w    BpL,d4
  1475.                move.l    a1,2(a2)
  1476.                move.w    d5,0(a2)
  1477.                bset      #0,6(a2)
  1478.                lea.l     8(a2),a2
  1479.                move.l    a1,d7
  1480.                move.w    d5,d1
  1481.                bra.s     lab_9
  1482.  
  1483. ;-----------------------------------------------------
  1484.  
  1485. tab1:          
  1486.                .DC.l proc_1
  1487.                .DC.l proc_2
  1488.                .DC.l proc_3
  1489.                .DC.l proc_4
  1490.                .DC.l proc_5
  1491.                .DC.l proc_6
  1492.  
  1493. ;-----------------------------------------------------
  1494.  
  1495. loop_1:        
  1496.                clr.w     d0
  1497.                lsr.w     2(sp)
  1498.                addx.w    d0,d0
  1499.                lsr.w     4(sp)
  1500.                roxl.w    #3,d0
  1501.                add.w     0(sp),d0
  1502.                movea.l   tab2(pc,d0.w),a4
  1503.                movem.l   d1/d2,-(sp)
  1504.                jsr       (a6)
  1505.                movem.l   (sp)+,d1/d2
  1506.                move.w    d1,d5
  1507.                lsl.w     #2,d5
  1508.                suba.w    d5,a0
  1509.                move.w    d1,d5
  1510.                addq.l    #2,d7
  1511.                movea.l   d7,a1
  1512. lab_9:         
  1513.                dbra      d2,loop_1
  1514.                addq.l    #6,sp
  1515.                rts       
  1516.  
  1517. ;-----------------------------------------------------
  1518.  
  1519. tab2:          
  1520.                .DC.l proc_7
  1521.                .DC.l proc_8
  1522.                .DC.l proc_9
  1523.                .DC.l proc_a
  1524.                .DC.l proc_b
  1525.                .DC.l proc_c
  1526.                .DC.l proc_d
  1527.                .DC.l proc_e
  1528. ;-----------------------------------------------------
  1529.  
  1530. loop_2:        
  1531.                move.w    (a1),d2
  1532.                swap.w    d2
  1533.                move.w    0(a1,d3.w),d2
  1534.                move.l    d2,(a2)+
  1535.                jmp       (a3)
  1536. ;-------------
  1537. proc_1:        
  1538.                move.w    d2,0(a1,d3.w)
  1539.                swap.w    d2
  1540.                move.w    d2,(a1)
  1541.                adda.w    d4,a1
  1542. proc_2:        
  1543.                dbra      d5,loop_2
  1544.                rts       
  1545.  
  1546. ;-----------------------------------------------------
  1547.  
  1548. loop_3:        
  1549.                move.w    (a1),d2
  1550.                move.w    d2,(a2)+
  1551.                jmp       (a3)
  1552. ;-------------
  1553. proc_3:        
  1554.                move.w    d2,(a1)
  1555.                adda.w    d4,a1
  1556. proc_4:        
  1557.                dbra      d5,loop_3
  1558.                rts       
  1559.  
  1560. ;-----------------------------------------------------
  1561.  
  1562. loop_4:        
  1563.                move.w    (a1),d2
  1564.                move.w    d2,(a2)+
  1565.                swap.w    d2
  1566.                jmp       (a3)
  1567. ;-------------
  1568. proc_5:        
  1569.                swap.w    d2
  1570.                move.w    d2,(a1)
  1571.                adda.w    d4,a1
  1572. proc_6:        
  1573.                dbra      d5,loop_4
  1574.                rts       
  1575.  
  1576. ;-----------------------------------------------------
  1577.  
  1578. func_1:        
  1579.                moveq.l   #0,d0
  1580.                move.w    (a0)+,d0
  1581.                rol.l     d6,d0
  1582.                moveq.l   #0,d1
  1583.                move.w    (a0)+,d1
  1584.                rol.l     d6,d1
  1585.                jmp       (a4)
  1586. ;-----------------------------------------------------
  1587. func_2:        
  1588.                moveq.l   #0,d0
  1589.                move.w    (a0)+,d0
  1590.                swap.w    d0
  1591.                ror.l     d6,d0
  1592.                moveq.l   #0,d1
  1593.                move.w    (a0)+,d1
  1594.                swap.w    d1
  1595.                ror.l     d6,d1
  1596.                jmp       (a4)
  1597. ;-----------------------------------------------------
  1598. proc_7:        
  1599. ; (~(D0|D1))&D2 --> D2
  1600.                or.l      d1,d0
  1601.                not.l     d0
  1602.                and.l     d0,d2
  1603.                jmp       (a5)
  1604. ;-----------------------------------------------------
  1605. proc_8:        
  1606. ; (D0|D2)&(~D1) --> D2
  1607.                or.l      d0,d2
  1608.                not.l     d1
  1609.                and.l     d1,d2
  1610.                jmp       (a5)
  1611. ;-----------------------------------------------------
  1612. proc_9:        
  1613. ; ((~D0)&D2)|D1 --> D2
  1614.                not.l     d0
  1615.                and.l     d0,d2
  1616.                or.l      d1,d2
  1617.                jmp       (a5)
  1618. ;-----------------------------------------------------
  1619. proc_a:        
  1620. ; (D0|D1|D2) --> D2
  1621.                or.l      d0,d2
  1622.                or.l      d1,d2
  1623.                jmp       (a5)
  1624. ;-----------------------------------------------------
  1625. proc_b:        
  1626. ; (~(D1^D2))&D0 --> D2
  1627.                eor.l     d1,d2
  1628.                not.l     d0
  1629.                and.l     d0,d2
  1630.                jmp       (a5)
  1631. ;-----------------------------------------------------
  1632. proc_c:        
  1633. ; (D0|D2)^D1 --> D2
  1634.                or.l      d0,d2
  1635.                eor.l     d1,d2
  1636.                jmp       (a5)
  1637. ;-----------------------------------------------------
  1638. proc_d:        
  1639. ; ((~D0)&D2)^D1 --> D2
  1640.                not.l     d0
  1641.                and.l     d0,d2
  1642.                eor.l     d1,d2
  1643.                jmp       (a5)
  1644. ;-----------------------------------------------------
  1645. proc_e:        
  1646. ; (D0^D2)|D1 --> D2
  1647.                eor.l     d0,d2
  1648.                or.l      d1,d2
  1649.                jmp       (a5)
  1650. ;-----------------------------------------------------
  1651. UndrawSprite:  
  1652. ; A2 = Zeiger auf SpriteSaveBlock
  1653.                bclr      #0,6(a2)
  1654.                beq       lab_10              ; raus
  1655.                move.w    0(a2),d4            ; xhot
  1656.                move.w    d4,d2               ; xhot
  1657.                subq.w    #1,d2               ; xhot - 1
  1658.                move.w    BpL,d3
  1659.                movea.l   2(a2),a0            ; Zeiger auf Bildschirmoffset
  1660.                lea.l     8(a2),a1            ; Zeiger auf Spritedaten
  1661.                move.w    VPlanes,d5
  1662.                subq.w    #2,d5
  1663.                bhi.s     lab_11
  1664.                beq.s     lab_12
  1665.  
  1666.                btst      #1,6(a2)
  1667.                bne.s     lab_13
  1668. loop_9:        
  1669.                move.w    (a1)+,(a0)
  1670.                adda.w    d3,a0               ; + Bytes per Line
  1671.                dbf       d2,loop_9           ; nächste Zeile
  1672.                rts                           ; raus
  1673. ;-----------------------
  1674. lab_13:        
  1675.                move.l    (a1)+,(a0)
  1676.                adda.w    d3,a0
  1677.                dbra      d2,lab_13
  1678.                rts       
  1679. ;-----------------------------------------------------
  1680. lab_12:        
  1681.                movea.l   a0,a5
  1682.                add.w     d4,d4
  1683.                btst      #1,6(a2)
  1684.                bne.s     lab_14
  1685.                movea.l   a1,a2
  1686.                adda.w    d4,a2
  1687. loop_5:        
  1688.                move.w    (a1)+,(a0)+
  1689.                move.w    (a2)+,(a0)
  1690.                adda.w    d3,a5
  1691.                movea.l   a5,a0
  1692.                dbra      d2,loop_5
  1693.                rts       
  1694. ;-------------
  1695. lab_14:        
  1696.                movea.l   a1,a2
  1697.                adda.w    d4,a2
  1698.                adda.w    d4,a2
  1699. loop_6:        
  1700.                move.w    (a1)+,(a0)+
  1701.                move.w    (a2)+,(a0)+
  1702.                move.w    (a1)+,(a0)+
  1703.                move.w    (a2)+,(a0)
  1704.                adda.w    d3,a5
  1705.                movea.l   a5,a0
  1706.                dbra      d2,loop_6
  1707.                rts       
  1708.  
  1709. ;-----------------------------------------------------
  1710.  
  1711. lab_11:        
  1712.                movea.l   a0,a5
  1713.                add.w     d4,d4
  1714.                btst      #1,6(a2)            ; VDI oder XOR ?
  1715.                bne.s     lab_15              ;
  1716.                movea.l   a1,a2
  1717.                adda.w    d4,a2
  1718.                movea.l   a2,a3
  1719.                adda.w    d4,a3
  1720.                movea.l   a3,a4
  1721.                add.w     d4,d4
  1722. loop_7:        
  1723.                move.w    (a1)+,(a0)+
  1724.                move.w    (a2)+,(a0)+
  1725.                move.w    (a3)+,(a0)+
  1726.                move.w    (a4)+,(a0)
  1727.                adda.w    d3,a5
  1728.                movea.l   a5,a0
  1729.                dbra      d2,loop_7
  1730.                rts       
  1731. ;-------------
  1732. lab_15:        
  1733.                add.w     d4,d4
  1734.                movea.l   a1,a2
  1735.                adda.w    d4,a2
  1736.                movea.l   a2,a3
  1737.                adda.w    d4,a3
  1738.                movea.l   a3,a4
  1739.                adda.w    d4,a4
  1740. loop_8:        
  1741.                move.w    (a1)+,(a0)+
  1742.                move.w    (a2)+,(a0)+
  1743.                move.w    (a3)+,(a0)+
  1744.                move.w    (a4)+,(a0)+
  1745.                move.w    (a1)+,(a0)+
  1746.                move.w    (a2)+,(a0)+
  1747.                move.w    (a3)+,(a0)+
  1748.                move.w    (a4)+,(a0)
  1749.                adda.w    d3,a5
  1750.                movea.l   a5,a0
  1751.                dbra      d2,loop_8
  1752. lab_10:        
  1753.                rts       
  1754. ;-----------------------------------------------------
  1755.  
  1756. CalcScreenPos: 
  1757. ; Parameter :
  1758. ; in :
  1759. ; D0.W = X-Position
  1760. ; D1.W = Y-Position
  1761. ; out :
  1762. ; D0.W = X mod 15
  1763. ; D1.L = offset vom Bildschirmanfang
  1764. ; alle anderen Register unverändert
  1765.  
  1766.                movem.w   d2/d3,-(sp)
  1767.  
  1768.                mulu.w    BpL,d1              ; Y *= Bytes per line
  1769.                clr.l     d2
  1770.                move.w    d0,d2               ; (long) X
  1771.                andi.w    #$fff0,d2
  1772.                move.w    MonPLine,d3
  1773.                asr.l     d3,d2
  1774.                add.l     d2,d1
  1775.                andi.w    #$f,d0              ; X mod 15
  1776.  
  1777.                movem.w   (sp)+,d2/d3
  1778.  
  1779.                rts       
  1780. ;#############################################################
  1781.  
  1782.                .DATA 
  1783.  
  1784. msg_title:     .DC.b 13,10
  1785.                .DC.b '⌠ Overscan Version 1.6    K.Isakovic ⌠',13,10,0
  1786. msg_installed: .DC.b '| installed.              B.Gebauer  |',13,10
  1787.                .DC.b '|                                    |',13,10
  1788.                .DC.b '⌡ Hold Shift-Key for Setup           ⌡',13,10,0
  1789. msg_notactive: .DC.b '⌡ NOT aktivated.          B.Gebauer  ⌡',13,10,0
  1790. msg_noTos:     .DC.b '| NOT installed.          B.Gebauer  |',13,10,7,7
  1791.                .DC.b '⌡ Only with TOS 1.2/1.4 or BETA-TOS  ⌡',13,10,0
  1792. msg_already:   .DC.b '⌡ already installed...    B.Gebauer  ⌡',13,10,7,7,0
  1793.  
  1794. msg_erase:     .DC.b 27,'E',0
  1795. user_x:        .DC.b 27,'Y',33,40,27,'p','X:',0
  1796. user_y:        .DC.b 'Y:',0
  1797. user_off:      .DC.b 'Off:',0
  1798. user_number:   .DC.b '    '
  1799. end_number:    .DC.b ' ',0
  1800.  
  1801. msg_help:      .DC.b 27,'H',27,'p'
  1802.                .DC.b '⌠ OVERSCAN Version 1.6    K.Isakovic ⌠',13,10
  1803.                .DC.b '|    Setup-Menu           B.Gebauer  |',13,10
  1804.                .DC.b '|------------------------------------|',13,10
  1805.                .DC.b '|                                    |',13,10
  1806.                .DC.b '| Cursorkeys : Width & Heigth        |',13,10
  1807.                .DC.b '| Block  / * : Edge left/right       |',13,10
  1808.                .DC.b '| Block  - + : Edge up/down          |',13,10
  1809.                .DC.b '|                                    |',13,10
  1810.                .DC.b '|      P     : Physbase emulation    |',13,10
  1811.                .DC.b '|      C     : Clear screen key      |',13,10
  1812.                .DC.b '|                                    |',13,10
  1813.                .DC.b '|    L M H   : Low Middle High Res.  |',13,10
  1814.                .DC.b '|                                    |',13,10
  1815.                .DC.b '|      S     : Save & Quit           |',13,10
  1816.                .DC.b '|      Q     : Quit without saving   |',13,10
  1817.                .DC.b '|                                    |',13,10
  1818.                .DC.b '|     Help   : This page             |',13,10
  1819.                .DC.b '|                                    |',13,10
  1820.                .DC.b '|------------------------------------|',13,10
  1821.                .DC.b '⌡   Press Return...                  ⌡',13,10,0
  1822.  
  1823. msg_change:    .DC.b 10,10
  1824.                .DC.b 13,10,'       Change Resolution.'
  1825.                .DC.b 13,10,'     Are you shure (y/n) ?',0
  1826.  
  1827. msg_phys_on:   .DC.b 10,10,13,10,'     Physbase emulation on  (y/n)',0
  1828. msg_phys_off:  .DC.b 10,10,13,10,'     Physbase emulation off (y/n)',0
  1829.  
  1830. msg_shift_on:  .DC.b 10,10,13,10,' Clear-screen with RIGHT-SHIFT/ALT/HELP (y/n)',0
  1831. msg_shift_off: .DC.b 10,10,13,10,' Clear-screen with ALT/HELP  (y/n)',0
  1832.  
  1833. save_name:     .DC.b 'A:\AUTO\OVERSCAN.PRG',0
  1834.  
  1835. msg_save:      .DC.b 27,'q',13,10,'  Setup saved...',13,10,0
  1836. msg_notfound:  .DC.b 27,'q',' not found !',13,10
  1837.                .DC.b 'press < Return > ',13,10,0
  1838. msg_nosave:    .DC.b 27,'q',13,10,'  Setup not saved...'
  1839.                .DC.b 13,10,0
  1840. SoundTab:      .DC.b 0,112,1,4,2,56,3,2,4,28,5,1
  1841.                .DC.b 6,20
  1842.                .DC.b 7,0
  1843.                .DC.b 8,16,9,16,10,16
  1844.                .DC.b 11,0,12,16,13,4
  1845.                .DC.b 255,16
  1846.                .DC.b 7,63
  1847.                .DC.b 255,4
  1848.                .DC.b 11,0,12,32,13,0
  1849.                .DC.b 7,56
  1850.                .DC.b 255,50
  1851.                .DC.b 7,63
  1852.                .DC.b 255,0
  1853.  
  1854.                .BSS 
  1855. GemStarted:    .DS.w 1   ; Läuft GEM schon ?
  1856. BadTos:        .DS.w 1   ; !0 == BlitterTOS
  1857. Offset:        .DS.w 1   ; Offset VideoAdd <> MyMemtop
  1858. RezX:          .DS.w 1   ; Breite des Bildschirms
  1859. RezY:          .DS.w 1   ; Höhe   des Bildschirms
  1860. BpL:           .DS.w 1   ; BytesPerLine , also Bytes pro Bildschirmzeile
  1861. Reso:          .DS.w 1   ; Aktuelle Auflösung
  1862. MonPLine:      .DS.w 1   ; ??? (was immer sich Julian dabei dachte...)
  1863. VPlanes:       .DS.w 1   ; Anzahl der Farbebenen
  1864. LineA:         .DS.l 1   ; Zeiger auf LineA Variablen
  1865. MouseVec:      .DS.l 1   ; temp. Kbdvbase
  1866. WorkOut:       .DS.l 1   ; Zeiger auf das WorkOut-Feld der 'v_opnwk()'-
  1867. ;           aufrufenden Funktion (hoffentlich der DESKTOP !)
  1868. Back:          .DS.l 1   ; RücksprungAddresse zu dieser Funktion
  1869. MyMemtop:      .DS.l 1   ;   Zwischenspeicher zur Restauration des Desktops nach
  1870. VidAdd:        .DS.l 1   ;   einem inkompatiblen Programm
  1871. BasAdd:        .DS.l 1   ;
  1872. MemEnd:        .DS.l 1   ;   Letzte beschreibbare Speicheraddresse
  1873. StartBasAdd:   .DS.l 1   ;   v_bas_add zu Beginn des Programms
  1874. Dx:            .DS.w 1   ; Zwischenspeicher für GrowBox Effekt
  1875. Dy:            .DS.w 1   ; Abweichung der Auflösung
  1876. Max:           .DS.w 1   ; Grössere Abweichung
  1877. Xa:            .DS.w 1   ;
  1878. Ya:            .DS.w 1   ; Koordinaten des GrowBox Effekt
  1879. Xe:            .DS.w 1   ;
  1880. Ye:            .DS.w 1   ;
  1881. X_Add:         .DS.l 1   ; Zeiger auf die aktuellen Bildschirmwerte
  1882. Y_Add:         .DS.l 1   ;
  1883. Off_Add:       .DS.l 1   ;
  1884. Y_Inc:         .DS.w 1   ; Inkrement der Bildschirmwerte
  1885. Off_Inc:       .DS.l 1   ;
  1886. X_Min:         .DS.w 1   ; Grenzen der Bildschirmwerte
  1887. X_Max:         .DS.w 1   ;
  1888. Y_Min:         .DS.w 1   ;
  1889. Y_Max:         .DS.w 1   ;
  1890. Pal3Save:      .DS.w 1   ; Farbpalette 3
  1891. PalFSave:      .DS.w 1   ; Farbpalette 15
  1892. ResoSave:      .DS.w 1   ; Start-Auflösung
  1893. UserKey:       .DS.w 1   ; Tastendruck beim UserSetup
  1894. UserSave:      .DS.w 1   ; EndeFlag für UserSetup
  1895. Handle:        .DS.w 1   ; Dateihandle
  1896. inst_ok:       .DS.w 1   ; Installationsstatus
  1897. _ende:         .DS.w 1
  1898.  
  1899.  
  1900.